<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      // 给定一个对象，包含多个员工的信息，每个员工有一个名字和年龄。使用 for in 遍历这个对象，并打印出每个员工的名字和年龄。
      // const employees = {
      //     '001': { name: 'John Doe', age: 30 },
      //     '002': { name: 'Jane Smith', age: 25 },
      //     '003': { name: 'Bob Johnson', age: 35 }
      // };
      // for (const key in employees) {
      //     console.log(employees[key].name + ':' + employees[key].age);
      // }

      // 给定一个字符串数组，包含一些国家的名字。使用 for of 遍历这个数组，并打印出每个国家的全名。
      // const countries = ['China', 'India', 'United States', 'Brazil'];
      // for (const tiem of countries) {
      //     console.log(tiem);
      // }

      // 给定一个字符串数组，包含一些水果的名字。使用 map 方法创建一个新的数组，其中包含每个水果的全名和简称。
      // const fruits = ['Apple', 'Banana', 'Cherry'];
      // let fr = fruits.map(tiem => tiem)
      // console.log(fr);

      // 给定一个数字数组，其中包含正数和负数。使用 filter 方法创建一个新的数组，只包含正数。
      // const mixedNumbers = [-10, -5, 3, 8, 0, -2];
      // let zhen = mixedNumbers.filter(tiem => tiem > 0)
      // console.log(zhen);

      // 给定一个数字数组，使用 reduce 方法计算所有数字的总和。
      // const numbers = [1, 2, 3, 4, 5];
      // let re = numbers.reduce((jishu, tiem) => jishu + tiem, 0)
      // console.log(re);

      // 计算特定条件的员工平均工资
      // 给定一个员工数组，每个员工有姓名、年龄和工资。找出年龄大于30岁的员工，然后计算他们的平均工资。
      // const employees = [
      //     { name: 'Alice', age: 25, salary: 50000 },
      //     { name: 'Bob', age: 35, salary: 60000 },
      //     { name: 'Charlie', age: 45, salary: 80000 },
      //     { name: 'David', age: 28, salary: 45000 }
      // ];
      // let pinjunzhi = employees.filter(tiem => tiem.age > 30)
      //     .map(tiem => tiem.salary)
      //     .reduce((jishu, tiem, index, arr) => jishu + tiem / arr.length, 0)
      // console.log(pinjunzhi);

      // 练习题 2: 筛选并转换字符串数组
      // 给定一个包含单词的数组，使用 filter 和 map 方法创建一个新数组，其中包含原数组中长度大于4的单词的首字母大写形式。
      // const words = ['javascript', 'array', 'map', 'filter', 'reduce', 'function'];
      // let newarr = words.filter(tiem => tiem.length > 4)
      //     .map(tiem => tiem.slice(0, 1).toUpperCase() + tiem.slice(1))
      // console.log(newarr);

      // let num = 0
      // let arrs = [1, 2, 3, 4, 5, 6];
      // for (i = 0; i <= arrs.length; i++) {
      //     let sum = arrs[i] % 2
      //     if (sum == 0) {
      //         num = num + arrs[i]
      //     }
      // }
      // console.log(num);

      //练习题 3: 计算数组中所有偶数的立方和
      // const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      // let sum = numbers.filter(tiem => !(tiem % 2)).map(tiem => tiem * tiem).reduce((jishu, tiem) => jishu + tiem, 0)
      // console.log(sum);

      // 简易闭包形式
      // function makeAdder(x) {
      //     return function (a) {
      //         return a + x
      //     }
      // }

      // // 测试
      // const addFive = makeAdder(5);
      // console.log(addFive(2)); // 应输出 7
      // console.log(addFive(3)); // 应输出 8

      // function factorial(n) {
      //     if (n === 0) return 1;
      //     return n * factorial(n - 1);
      // }

      // console.log(factorial(5));

      // var randomInt = Math.ceil(Math.random() * 10);
      // console.log(randomInt);

      // function fin(arr, value) {
      //     return arr.findIndex((element) => element > value)

      // }
      // let [num, ta] = [[3, 8, 12, 5, 10], 7]
      // console.log(fin(num, ta));

      // 数组扩展方法
      // 任何一个实例数组都可以使用
      // 自定义方法写在数组prototype上
      // const arr = [1, 2, 3, 4, 5]
      // Array.prototype.max = function () {
      //     return Math.max(...this)
      //     //原型函数里面的this指向 实例对象 arr
      // }

      // console.log(arr.max());

      // const arr = new Array(1, 2)
      // console.log(arr);

      // 求和方法
      // Array.prototype.sum = function () {
      //     return this.reduce((prev, item) => prev + item, 0)
      // }
      // const arr = [2, 3, 4, 5]
      // console.log(arr.sum())
      // console.log([1, 2, 3].sum());

      // function Person(name) {
      //     this.name = name
      // }
      // let son = new Person('pink')
      // console.log(son);
      // console.log(Object.keys(son) + ':' + Object.values(son));

      // function Star() {

      // }
      // const son = new Star()
      // // 对象原型__proto__指向 该构造函数的原型对象
      // console.log(son.__proto__);
      // console.log(son.__proto__ === Star.prototype);
      // // 对象原型里面有constructor 指向 构造函数 Star
      // console.log(son.__proto__.constructor === Star);
      // let newarr = []

      // function shuffleArray(array) {
      //     let arrs = array.slice()
      //     for (let i = 0; i < arrs.length; i++) {
      //         let indexs = Math.floor(Math.random() * arrs.length);
      //         [arrs[i], arrs[indexs]] = [arrs[indexs], arrs[i]]
      //     }
      //     return arrs
      // }
      // const originalArray = [1, 2, 3, 4, 5];
      // console.log(shuffleArray(originalArray));

      // const originalArray = [1, 2, 3, 4, 5];
      // function shuffleArray(array) {
      //     let newarr = []
      //     const lens = array.length
      //     for (let i = 0; i <= lens - 1; i++) {
      //         let indexs = Math.floor(Math.random() * array.length);
      //         newarr.push(array[indexs])
      //         array.splice(indexs, 1)
      //     }
      //     return newarr
      // }

      // console.log(shuffleArray(originalArray));

      // function fun(name) {
      //     this.name = name
      // }
      // let sun = new fun('nikui')
      // let fu = new fun('你好')
      // console.log(fun.prototype.constructor);
      // console.log(sun.__proto__.constructor);
      // console.log(sun.prototype === fu.prototype);
      // console.log();

      // 箭头函数
      //   const sayHi = function () {
      //     console.log(this); // 该箭头函数中的 this 为函数声明环境中 this 一致
      //   };
      //   const user = {
      //     name: "小明",
      //     // 该箭头函数中的 this 为函数声明环境中 this 一致
      //     walk: () => {
      //       console.log(this);
      //     },

      //     sleep: function () {
      //       let str = "hello";
      //       console.log(this);
      //       let fn = () => {
      //         console.log(str);
      //         console.log(this); // 该箭头函数中的 this 与 sleep 中的 this 一致
      //       };
      //       // 调用箭头函数
      //       fn();
      //     },
      //   };
      //   // 动态添加方法
      //   user.sayHi = sayHi;

      //   user.sayHi(); //this指向user
      //   user.walk(); //箭头函数指向window
      //   user.sleep(); //this指向user

      // 通过构造函数创建普通对象
      //   const user = new Object({ name: "小明", age: 15 });

      //   // 这种方式声明的变量称为【字面量】
      //   let student = { name: "杜子腾", age: 21 };

      //   // 对象语法简写
      //   let name = "小红";
      //   let people = {
      //     // 相当于 name: name
      //     name,
      //     // 相当于 walk: function () {}
      //     walk() {
      //       console.log("人都要走路...");
      //     },
      //   };

      //   console.log(student.constructor);
      //   console.log(user.constructor);
      //   console.log(student instanceof Object);
    </script>
  </body>
</html>
